# face detector 3.1
# Haar-based face detector
import numpy as np
from matplotlib import pyplot as plt
import cv2


# visualize functions
def show_img_matplotlib(color_img, title, pos):
    img_rgb = color_img[:, :, ::-1]
    ax = plt.subplot(2, 2, pos)
    plt.imshow(img_rgb)
    plt.title(title, fontsize=8)
    plt.axis('off')


# draw the face detection box function
def show_detection(image, faces):
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
    return image


# load image
img = cv2.imread("picture/005.jpg")

# bgr_img -> gray_img
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# load classifier
cas_alt2 = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
cas_default = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

# detect face
faces_alt2 = cas_alt2.detectMultiScale(gray)
faces_default = cas_default.detectMultiScale(gray)
print(faces_alt2)
# print(faces_default)

# one line of code to implement Haar-based face detector
retval, faces_haar_alt2 = cv2.face.getFacesHAAR(img, "haarcascade_frontalface_alt2.xml")
faces_haar_alt2 = np.squeeze(faces_haar_alt2)
retval, faces_haar_default = cv2.face.getFacesHAAR(img, "haarcascade_frontalface_default.xml")
faces_haar_default=np.squeeze(faces_haar_default)

# draw the face detection box
img_faces_alt2 = show_detection(img.copy(), faces_alt2)
img_faces_default = show_detection(img.copy(), faces_default)
img_faces_haar_alt2=show_detection(img.copy(),faces_haar_alt2)
img_faces_haar_default=show_detection(img.copy(),faces_haar_default)


# visualization
show_img_matplotlib(img_faces_alt2, "detectMultiScale(frontalface_alt2):" + str(len(faces_alt2)), 1)
show_img_matplotlib(img_faces_default, "detectMultiScale(frontalface_default):" + str(len(faces_default)), 2)
show_img_matplotlib(img_faces_haar_alt2,"getFacesHAAR(frontalface_alt2):"+str(len(faces_haar_alt2)),3)
show_img_matplotlib(img_faces_haar_default,"getFaceHAAR(frontalface_default):"+str(len(faces_haar_default)),4)


plt.show()
